package lq260;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

class TreeNode {
	public int val;
	public String s; // 数值对应字符串
	public TreeNode p; // 父节点
	public TreeNode l;
	public TreeNode r;
	public int deep; // 表示第几层
	public int rrl; // “右根左”遍历的次序，对应绘图行数

	public TreeNode(int val, TreeNode l, TreeNode r, int deep) {
		this.val = val;
		this.s = String.valueOf(val);
		this.l = l;
		this.r = r;
		this.deep = deep;
		this.p = null;
	}
}

public class Main {

	// 输入优化模板开始
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StreamTokenizer st = new StreamTokenizer(br);

	static int rd() throws IOException {
		st.nextToken();
		return (int) st.nval;
	}
	// 输入优化模板结束

	static int maxDeep; // 树的最大深度

	static TreeNode root = null;

	static char[][] pic = new char[200][200];

	// 构建排序二叉树
	// 循环插入数据建树
	static TreeNode insert(TreeNode n, int v, int d) {
		if (n == null) {
			return new TreeNode(v, null, null, d);
		} else {
			if (v < n.val) {// 创建左子树
				n.l = insert(n.l, v, d + 1);
				n.l.p = n;
			} else { // 创建右子树
				n.r = insert(n.r, v, d + 1);
				n.r.p = n;
			}
		}
		// 返回当前根节点
		return n;
	}

	// 先序遍历(模板)
	static void preorder(TreeNode t) {
		if (t != null) {
			// 先根
			//System.out.println(t.val + " ");
			// 左子树
			preorder(t.l);
			// 右子树
			preorder(t.r);
		}
	}

	
	// “右根左”遍历，此题的情况
	static int row = 1; // 记录当前是第几行（“右根左”遍历的次序）
	static void rrootl(TreeNode t) {
		if (t != null) {
			// 右子树
			rrootl(t.r);

			// 根，记录行数
			t.rrl = row;
			// 行加1
			row++;
			// 左子树
			rrootl(t.l);
		}
	}

	// 根据树的数据填pic数组（绘图）
	// col为起始列
	static void printtree(TreeNode t, int col) {
		// 填当前节点
		// 将字符串写入 matrix[2] 的第 4 个位置开始
		t.s.getChars(0, t.s.length(), pic[t.rrl], col);
		col += t.s.length();

		// 如果有右子树
		if (t.r != null) {
			// 向上画路径
			// 填'-'
			pic[t.rrl][col] = '-';
			
			// 向上路径长度
			//int up = t.r.rrl - t.rrl + 1;
			for (int i = t.rrl; i >= t.r.rrl; i--) {
				pic[i][col + 1] = '|';
			}
			
			pic[t.r.rrl][col+2] = '-';
			
			//右子树
			printtree(t.r,col+3);
		}

		// 如果有左子树
		if (t.l != null) {
			// 向上画路径
			// 填'-'
			pic[t.rrl][col] = '-';
			// 向上路径长度
			//int up = t.l.rrl - t.rrl + 1;
			for (int i = t.rrl; i <= t.l.rrl; i++) {
				pic[i][col + 1] = '|';
			}
			pic[t.l.rrl][col+2] = '-';
			//左子树
			printtree(t.l,col+3);
		}
		
		//向前补‘.’
		for(int i=1;i<col;i++) {
			if(pic[t.rrl][i]==0) {
				pic[t.rrl][i] = '.';
			}
		}
	}

	public static void main(String[] args) throws IOException {
		String[] line = br.readLine().split(" ");
		for (int i = 0; i < line.length; i++) {
			root = insert(root, Integer.parseInt(line[i]), 1);
		}
		//“右根左”遍历树，记录每个节点的次序（对应绘图行数）
		rrootl(root);
		//填充pic数组（数组对应图形）
		printtree(root,1);

		//控制台输出图形
		for(int i=1;i<=row;i++) {
			int col=1;
			while(pic[i][col]!=0) {
				System.out.print(pic[i][col]);
				col++;
			}
			System.out.println();
		}
	}

}
